package chapter_5.demo2;

import chapter_4.Dish;

import java.util.Arrays;
import java.util.List;

/**
 * @author: hero生仔
 */
public class Solution {
    static List<Dish> menu = Arrays.asList(
            new Dish("pork", false, 800, Dish.Type.MEAT),
            new Dish("beef", false, 700, Dish.Type.MEAT),
            new Dish("chicken", false, 400, Dish.Type.MEAT),
            new Dish("french fries", true, 530, Dish.Type.OTHER),
            new Dish("rice", true, 350, Dish.Type.OTHER),
            new Dish("season fruit", true, 120, Dish.Type.OTHER),
            new Dish("pizza", true, 550, Dish.Type.OTHER),
            new Dish("prawns", false, 300, Dish.Type.FISH),
            new Dish("salmon", false, 450, Dish.Type.FISH));

    public static void main(String[] args) {
//        extracted01();

//        extracted02();
    }

    private static void extracted02() {
        // 想找到一道素食菜肴，并需要显式检查 Optional 对象中是否存在一道菜可以访问其名称
        menu.stream()
                .filter(Dish::isVegetarian)
                .findAny()
                // ifPresent(Consumer<T> block) 会在值存在的时候执行给定的代码块。
                .ifPresent(dish -> System.out.println(dish.getName()));

    }

    private static void extracted01() {
        // anyMatch：检查谓词是否至少匹配一个元素
        if (menu.stream().anyMatch(Dish::isVegetarian)) {
            System.out.println("The menu is (somewhat) vegetarian friendly!!");
        }

        // allMatch：检查谓词是否匹配所有元素
        // noneMatch：确保流中没有任何元素和给定的谓词匹配

        /*
        涉及到一个短路求值：对于流而言，有些操作不需要处理整个流就有结果，上述的方法包括limit都如此，只需要找到一个元素就知道结果的；
        在碰到无限大小的流的时候，这种操作就有用了，可以将无限流变成有限流。
         */
    }
}
